import { isDate, isObject } from "./typeJudge"

function _encodeURL(urlPieces: string): string {
    // 需要将安全编码后的内容再转换回来
    return window.encodeURIComponent(urlPieces)
        .replace(/%40/g, '@')
        .replace(/%3A/ig, ':')
        .replace(/%24/g, '$')
        .replace(/%2C/ig, ',')
        .replace(/%20/g, '+')
        .replace(/%5B/ig, '[')
        .replace(/%5D/ig, ']');
}

export function buildURL(url: string, params: any): string {
    if (!params) {// 如果不存在参数直接返回URL即可
        return url;
    }
    const urlParts: string[] = [];// 用于存储URL片段
    Object.keys(params).forEach((key) => {
        const val = params[key];
        if (!val) return;// 如果不存在value值，该轮次直接返回
        let keyValues: string[] = [];// 统一存储处理各项value值
        if (Array.isArray(val)) {
            keyValues = val;// value值是数组时直接赋值给keyValues
            key += "[]"
        } else {
            keyValues.push(val);// 否则将value直接推入数组
        }
        keyValues.forEach((val) => {
            if (isDate(val)) {
                val = val.toISOString();
            } else if (isObject(val)) {
                val = JSON.stringify(val);
            }
            urlParts.push(`${_encodeURL(key)}=${_encodeURL(val)}`);// 将当前url片段推入
        });
    });
    let tailUrl = urlParts.join("&");// 拼接出&
    if(tailUrl){
        const hashIndex = url.indexOf("#");
        if(hashIndex > -1) url.slice(0,hashIndex);// 忽略URL哈希值后面的部分
        url += (url.indexOf("?") === -1 ? "?":"&") + tailUrl;// 判断原URL地址是否已经带了问号，有就拼&，没有就拼？
    }
    return url;
}

